// 配置路由的地方
import Vue from 'vue';
import VueRouter from 'vue-router';
// 使用插件
Vue.use(VueRouter);
// 引入路由配置
import routes from './routes'
// 引入仓库store
import store from '@/store/index.js'

// 重写push,replace方法
// 先把原型对象上的push保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
VueRouter.prototype.push = function(location, resolve, reject) {
    if (resolve && reject) {
        // call/apply的区别：都可以调用一次，修改函数的上下文一次
        // 不同点：call多个参数用逗号隔开，apply传递数组
        originPush.call(this, location, resolve, reject)
    } else {
        originPush.call(this, location, () => {}, () => {})
    }
};
VueRouter.prototype.replace = function(location, resolve, reject) {
    if (resolve && reject) {
        // call/apply的区别：都可以调用一次，修改函数的上下文一次
        // 不同点：call多个参数用逗号隔开，apply传递数组
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(this, location, () => {}, () => {})
    }
}

// 配置路由
let router = new VueRouter({
    // 配置路由
    routes,
    // 配置滚动行为
    // 控制滚动条滚动条水平和垂直方向的位置
    // 返回的y:0,表示路由跳转时，滚动条离顶部的距离
    scrollBehavior(to, from, savedPosition) {
        return { x: 0, y: 0 }
    }
})

// 配置全局前置路由守卫
// 在路由跳转之前进行判断
router.beforeEach(async(to, from, next) => {
    // to表示原路由,from表示目标路由,next是放行函数
    // next(path):放行到指定的路由
    // next(false):
    let token = store.state.User.token;
    let user = store.state.User.userInfo.name;
    // 如果用户已经登录了
    if (token) {
        // 不能去login
        if (to.name == 'Login' || to.name == 'Register') {
            next('/home');
        } else {
            // 登录了,但是去的不是login
            if (user)
                next();
            else {
                try {
                    let res = await store.dispatch('getUserInfo');
                    next();
                } catch (e) {
                    // 本地有token,但是通过token请求数据失败了,可能是token过期了
                    alert(e.message + '身份验证已经过期,请重新登录!');
                    console.log('身份验证过期');
                    // 清空本地token
                    await store.dispatch('UerLogOut');
                    next('/login');
                }
            }
        }
    } else {
        // 用户还未登录,不能去交易相关(trade),支付相关(pay,paysuccess),个人中心(order)
        let toName = to.name;
        if (toName == 'Trade' || toName.indexOf('Pay') != -1 || toName == 'MyOrder') {
            // 将无法到达的路由通过query参数保存起来,等下登录的时候就保存起来
            next('/login?redircet=' + to.path)
        } else {
            // 去的不是这些页面就放行
            next();
        }
    }

})


// 暴露路由
export default router;